package com.aiju.support.proxy;

import com.aiju.utils.L;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * @author: 佐为
 * @date: 2017-02-20 11:44
 * @version: V1.0
 * @Description: 动态代理
 */
public class DynamicProxy implements InvocationHandler {

    //这个就是我们要代理的真实对象
    private Object subject;

    //绑定委托对象，并返回代理类
    public Object bind(Object object) {
        this.subject = object;
        //绑定该类实现的所有接口，取得代理类
        return Proxy.newProxyInstance(object.getClass().getClassLoader(),
                object.getClass().getInterfaces(), this);
    }

    @Override
    public Object invoke(Object object, Method method, Object[] args) throws Throwable {
        //在代理真实对象前我们可以添加一些自己的操作
        L.d("before");
        //当代理对象调用真实对象的方法时，其会自动的跳转到代理对象关联的handler对象的invoke方法来进行调用
        Object result = null;
        result = method.invoke(subject, args);
        //在代理真实对象后我们也可以添加一些自己的操作
        L.d("after");
        return result;
    }

    /**
     *
     *  DynamicProxy proxy = new DynamicProxy();
     *  //绑定该类实现的所有接口
     *  Subject sub = (Subject) proxy.bind(new RealSubject());
     *  sub.doSomething();
     *
     */
}
